perm filename DFTP.COR[NET,MRC] blob
sn#242254 filedate 1976-10-14 generic text, type T, neo UTF8
-!DFTP.MAC←DFTP.OLD
-1,11
TITLE DFTP Datacomputer File Transfer Program
IFNDEF F.TENX,F.TENX==-1 ; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX
IFNDEF F.PCAP,F.PCAP==-1 ; PRIVILEGED CAPABILITIES RESTRICTION
IFNDEF F.SAIL,F.SAIL==0 ; -1 IF FOR SAIL
-27,27
IFL F.TENX,DEFINE THUD<.LOSE 1000>
IFE F.TENX,DEFINE THUD<HALT .-1>
IFG F.TENX,THUD==-1
-76
IFL F.TENX,DEFINE RELOC(ADDR)<LOC ADDR>
-216
; ((ITS))
IFL F.TENX,<
SEARCH SITS
LOC 150
; Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO. First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).
INIT: MOVSI (JUMPA)
HRR .JBSA##
.BREAK 12,[400001,,] ;set start address
SETZ 1,
MOVE [1,,2]
BLT 150
.BREAK 16,100000 ;return to DDT
JRST DFTP
; I/O Channels
TTI==1 ; TTY I/O
TTO==2
DCI==3 ; Datalanguage I/O
DCO==4
ICP==5 ; ICP channel
DDI==6 ; Data I/O
DDO==7
LCI==10 ; Local input
LCO==11 ; Local output
; ITS network definitions
%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11
DEFINE TBIN(REG)
< .IOT TTI,REG
CAIG REG,"z"
CAIGE REG,"a"
CAIA
TRZ REG," ">
TBOUT==<.IOT TTO,>
DEFINE TSOUT(STRING)
< IRP STRING
< PUSH STAK,R1
MOVEI R1,STRING
PUSHJ STAK,$STRIN
POP STAK,R1
>>
; Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.
$STRIN: PUSH STAK, ; save AC 0
HRLI R1,(POINT 7,) ; build a byte pointer to string
$STRI1: ILDB R1 ; get a character from string
JUMPE $STRI2 ; quit when done
.IOT TTO, ; output the character
JRST $STRI1 ; and loop for more
$STRI2: POP STAK, ; restore AC 0
POPJ STAK, ; and return
DEFINE DCBIN(REG)
< .IOT DCI,REG
SKIPE FLAGDD
.IOT TTO,REG
>
DCBOUT==<.IOT DCO,>
DEFINE DCSOUT(STRING)
< IRP STRING
< PUSH STAK,R1
MOVEI R1,STRING
PUSHJ STAK,$DSTRI
POP STAK,R1
>>
; Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.
$DSTRI: PUSH STAK, ; save AC 0
HRLI R1,(POINT 7,) ; build a byte pointer to string
$DSTR1: ILDB R1 ; get a character from string
JUMPE $DSTR2 ; quit when done
.IOT DCO, ; output the character
SKIPE FLAGDD ; show DATALANGUAGE?
.IOT TTO,
JRST $DSTR1 ; and loop for more
$DSTR2: POP STAK, ; restore AC 0
POPJ STAK, ; and return
>
-245
CAIE REG,175
CAIN REG,176
MOVEI REG,33
-246: CAILE REG,"Z"+40
-260,260
ILDB REG,DCIBUF+1
JUMPE REG,.-4>
-270,273
-281,281
IFG F.TENX,<
-331,334
; ***PROGRAM***
DFTP:
IFE F.TENX,JFCL ;CCL ENTRY POINT
IFGE F.TENX,RESET
-345
; (((ITS)
IFL F.TENX,<
MOVEI UTIL,CMDM2
.SUSET [.RXUNAME,,REG1]
.CALL [ SETZ
SIXBIT/OPEN/
MOVEI
[('DSK')]
['.FILE.']
['(DIR) ']
SETZ REG1]
MOVEI UTIL,CMDM1 ; NO ITS DIRECTORY
>
; (((↑↑↑)))
-346:; (((TOPS-10)))
-349,349
; (!DISABLE!)
-353,353
IFG F.TENX,<
-382,383
; (((ITS)))
IFL F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,GET,CGET,LINK,CLIN,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)))
IFE F.SAIL,<
-392,393
; (((SAIL)))
IFN F.SAIL,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,GET,CGET,LINK,CLIN,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
-480,480
IFG F.TENX,<
-481:CEXE: MOVEI REG1,37
-525
IFE F.SAIL,<
-535,535
>>
-577,577
-687,687
IFG F.TENX,<
-732,733
; (((TOPS-10+ITS)))
IFLE F.TENX,<
-734:P$2MP: TSOUT <CRLF>
-738,738
IFG F.TENX,<
-791,791
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST P$ICHR
-808,809
IFGE F.TENX,< ; have to use ' for passwords
CAIN IOREG,":"
JRST P$IPON
>
-990,991
; (((ITS)))
IFL F.TENX,<
CAIE IOREG," "
JRST P$IENN
TLNN FLAG,PATHLR!PATHRL
JRST P$IENN
JUMPN R12,[ TLNE FLAG,PATHRL
JRST P$ICHE ; GET -- second argument
JRST P$IENN]
TLNE FLAG,PATHLR
JRST P$ICHE ; PUT -- first argument
JRST P$IENN
P$IENN:
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
-1232,1233
; (((TOPS-10+ITS)))
IFLE F.TENX,<
-1234: HRRZI IOREG,ABUF
-1239,1239
IFG F.TENX,<
-1248,1248
-1258,1258
TSOUT <[ASCIZ / ?? DATACOMPUTER initialization failure ??/],CRLF>
-1275,1276
; (((ITS)))
IFL F.TENX,<
.SUSET [.RXUNAME,,UBUF1]
SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
IFE F.SAIL,<
-1284
>
IFN F.SAIL,<
GETPPN REG1,
JFCL
HRLZM REG1,UBUF1
SETZM UBUF1+1
>
>
; (((↑↑↑)))
; (((TOPS-10+ITS)))
IFLE F.TENX,<
-1285: SETZM <UBUF1+2>
-1301,1301
IFG F.TENX,<
-1451
; (((NOT ITS OR SAIL)))
IFGE F.TENX,<
IFE F.SAIL,<
-1462,1462
IFG F.TENX,<
-1479,1479
>
>
; (((↑↑↑)))
IFL F.TENX,SETZ IOREG,
IFN F.SAIL,SETZ IOREG,
-1732,1732
IFG F.TENX,<
-1733: SETZM FLAGCO
-1757,1758
; (((TOPS-10+ITS)))
IFLE F.TENX,<
-1763,1763
IFG F.TENX,<
-2060,2060
; (((TENEX+ITS)))
-2468,2468
TSOUT <[ASCIZ / ?? Fatal DATACOMPUTER error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
.VALUE
.BREAK 16,160000
>
; (((↑↑↑)))
-2475,2475
IFG F.TENX,<
-2476: HALTF
-2481,2481
-2492,2492
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TAIN1
-2569,2569
IFL F.TENX,MOVEI TCIO,12
IFGE F.TENX,JRST TCICHR
-2734,2734
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TSICHR
-2805,2805
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TNICHR
-2806: CAIN IOREG,12
-2922,2926
; ***SYSTEM DEPENDENT ROUTINES***
; (((ITS)))
IFL F.TENX,<
-2930,3087
.OPEN TTI,[.UAI,,'TTY'] ; TTY input
THUD
.CALL [ SETZ
SIXBIT/TTYGET/ ; set TTY parameters
MOVEI TTI ; TTY channel
MOVEM ; first set of character groups
MOVEM ; second set of character groups
SETZM REG1] ; TTYSTS variable
THUD
TLO REG1,200 ; disable **MORE** processing
MOVE [030303,,030303] ; turn off echoing
.CALL [ SETZ
SIXBIT/TTYSET/ ; set TTY parameters
MOVEI TTI ; TTY channel
MOVE ; first set of character groups
MOVE ; second set of character groups
SETZ REG1] ; TTYSTS variable
THUD
.OPEN TTO,[.UAO,,'TTY'] ; TTY output
THUD
.CALL [ SETZ ; host number
SIXBIT/NETHST/
MOVEI -1
MOVEM
SETZM LHOST]
THUD
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .UII!40050 ; OPEN on gensymmed socket, 32 bits
MOVEI ICP
[('NET')] ; network device
[-1] ; initial local socket is gensymmed
MOVEI DCSOKT ; initial foreign socket(DATACOMPUTER)
SETZI DCHOST] ; foreign host(CCA)
JRST ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI ICP
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
MOVE REG1,[ICP,,RCHBLK]
.RCHST REG1, ; get status of network channel
HRRE REG1,RCHBLK+4 ; get status of network
JUMPL REG1,NETDED ; network dead if .LE. 0
CAIN REG1,%NSCLI ; CLS w/ input?
JRST ICPWIN
CAIN REG1,%NSINP ; input available?
CAIN REG1,%NSOPN ; connection open?
JRST ICPWIN
JUMPN REG1,[THUD] ; any other condition is lossage
ICPCLS: TSOUT <[ASCIZ/Cannot establish network connection/]>
.BREAK 16,160000
NETDED: TSOUT <[ASCIZ/ARPAnet is down/]>
.BREAK 16,160000
ICPWIN: MOVE REG1,RCHBLK+1 ; get gensymmed local socket
ADDI REG1,2 ; receive
MOVEM REG1,LCLRCV
ADDI REG1,1 ; transmit
MOVEM REG1,LCLTRN
.IOT ICP,REG1 ; get foreign place's socket
.CLOSE ICP, ; free up ICP socket right away
MOVEM REG1,FORRCV ; receive
ADDI REG1,1 ; socket to me!
MOVEM REG1,FORTRN
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI 40!.UAI
MOVEI DCI ; DATACOMPUTER input
[('NET')]
LCLRCV
FORTRN
SETZI DCHOST]
JRST ICPCLS
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI 40!.UAO
MOVEI DCO ; DATACOMPUTER output
[('NET')]
LCLTRN
FORRCV
SETZI DCHOST]
JRST ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DCI
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DCO
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
MOVEI REG1,2 ; offset for data sockets
ADDM REG1,LCLRCV
ADDM REG1,LCLTRN
ADDM REG1,FORRCV
ADDM REG1,FORTRN
-3092,3112
QUIT: .IOT DCO,["Z"-100] ; SEND QUIT
QUIT1: DCBIN <IOREG>
JUMPGE IOREG,QUIT1
.CLOSE DCI,
.CLOSE DCO,
.BREAK 16,160000
-3117,3135
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI DDI ; DATACOMPUTER data input
[('NET')]
LCLRCV
FORTRN
SETZI DCHOST]
THUD
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DDI
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
RETURN SKIP,1
-3141,3159
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BIO
MOVEI DDO ; DATACOMPUTER data output
[('NET')]
LCLTRN
FORRCV
SETZI DCHOST]
THUD
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DDO
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
RETURN SKIP,1
-3160: ENDR
-3165,3171
.CLOSE DDI,
.CLOSE DDO,
-3175,3181
;
NETNI: BEGINR
MOVE UTIL,LCLRCV
-3185,3298
;
NETNO: BEGINR
MOVE UTIL,LCLTRN
ENDR
-3303,3315
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI LCI
LCLDEV
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCOI1
RETURN SKIP,1
LOCOI1: TSOUT <[ASCIZ/ (Local file not found.)/],CRLF>
-3320,3344
LOCOO: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BIO
MOVEI LCO
LCLDEV
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCOO1
RETURN SKIP,1
LOCOO1: TSOUT <[ASCIZ/ ?? Local file creation failure ??/],CRLF>
-3345: ENDR
-3350,3363
.CLOSE LCI,
.CLOSE LCO,
ENDR
; LOCS -- LOCAL FILE (SIZE)
;
LOCS: BEGINR
.CALL [ SETZ
SIXBIT/FILLEN/
MOVEI LCI
SETZM UTIL]
SETZ UTIL, ; it should not crap out
-3368,3427
LOCDG: BEGINR <BPREG,UTIL>
MOVE BPREG,[POINT 7,GBUF1]
ILDB UTIL,BPREG
JUMPE UTIL,RETN(0)
CAIN UTIL," "
MOVEI UTIL,"0"
MOVEI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
ILDB UTIL,BPREG
CAIE UTIL,"-"
RETURN
MOVE REG2,[POINT 7,REG3]
SETZ REG3,
ILDB UTIL,BPREG
IDPB UTIL,REG2
ILDB UTIL,BPREG
IDPB UTIL,REG2
ILDB UTIL,BPREG
IDPB UTIL,REG2
MOVEI REG2,↑D12
CAMN REG3,LOCDM-1(REG2)
JRST .+3
SOJGE REG2,.-2
RETURN
ILDB UTIL,BPREG
CAIE UTIL,"-"
RETURN
ILDB UTIL,BPREG
MOVEI REG3,-"0"(UTIL)
IMULI REG3,↑D10
ILDB UTIL,BPREG
ADDI REG3,-"0"(UTIL)
LSH REG3,↑D27
LSH REG2,↑D23
ADD REG3,REG2
MOVS REG1,REG1
ADD REG3,REG1
ILDB UTIL,BPREG
CAIE UTIL," "
RETURN
ILDB UTIL,BPREG
MOVEI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,6
ILDB UTIL,BPREG
CAIE UTIL,":"
RETURN
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,6
ILDB UTIL,BPREG
JUMPE UTIL,LOCDG1 ; ALLOW FOR TOPS-10SES
CAIE UTIL,":"
RETURN
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
LSH REG1,1
CAIA
LOCDG1: IMULI REG1,↑D20
ADDI REG3,(REG1)
.CALL [ SETZ
SIXBIT/SFDATE/
MOVEI LCO
SETZ REG3]
JFCL
-3433,3484
.CALL [ SETZ
SIXBIT/RFDATE/
MOVEI LCI
SETZM REG2]
MOVSI REG2,124201 ; ASSUME APRIL 1, 1984
MOVE REG1,[POINT 7,GBUF1]
LDB REG3,[POINT 5,REG2,17] ; DAY
IDIVI REG3,↑D10
ADDI REG3,"0"
CAIN REG3,"0"
MOVEI REG3," "
ADDI REG4,"0"
IDPB REG3,REG1
IDPB REG4,REG1
MOVEI REG3,"-"
IDPB REG3,REG1
LDB REG3,[POINT 4,REG2,12] ; MONTH
HRRI REG3,LOCDM-1(REG3)
HRLI REG3,(POINT 7,)
SCOPY (REG3,REG1)
MOVEI REG3,"-"
IDPB REG3,REG1
LDB REG3,[POINT 7,REG2,8] ; YEAR
IDIVI REG3,↑D10
ADDI REG3,"0"
ADDI REG4,"0"
IDPB REG3,REG1
IDPB REG4,REG1
MOVEI REG3," "
IDPB REG3,REG1
LDB REG2,[POINT 17,REG2,34] ; TIME IN SECONDS
IDIVI REG2,↑D3600
MOVEI REG4,(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2,":"
IDPB REG2,REG1
MOVEI REG2,(REG4)
IDIVI REG2,↑D60
MOVEI REG4,(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2,":"
IDPB REG2,REG1
MOVEI REG2,(REG4)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
SETZ REG2,
IDPB REG2,REG1
ENDR ; return
-3488,3499
LOCDM: ASCII/JAN/
ASCII/FEB/
ASCII/MAR/
ASCII/APR/
ASCII/MAY/
ASCII/JUN/
ASCII/JUL/
ASCII/AUG/
ASCII/SEP/
ASCII/OCT/
ASCII/NOV/
ASCII/DEC/
-3504,3612
LUTFN: BEGINR <IOREG>
MOVSI REG1,'DSK' ; set defaults
MOVEM REG1,LCLDEV
.SUSET [.RSNAME,,LCLSNM]
SETZM LCLFN1 ; < prevent assembly error
MOVSI REG1,'> '
MOVEM REG1,LCLFN2
HRLI IOREG,(POINT 7,)
LUTFN1: CALLR LUTWRD ; get a SIXBIT word
JUMPE REG1,LUTF1A
CAIN REG2,":" ; device
JRST [ MOVEM REG1,LCLDEV
JRST LUTFN1]
CAIN REG2,";" ; SNAME
JRST [ MOVEM REG1,LCLSNM
JRST LUTFN1]
SKIPN LCLFN1 ; FN1
JRST [ MOVEM REG1,LCLFN1
JRST LUTF1A]
MOVEM REG1,LCLFN2 ; FN2
LUTF1A: JUMPN REG2,LUTFN1
ENDR
; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN REG1, DELIMITER IN REG2
;
LUTWRD: BEGINR <BPREG>
SETZ REG1, ; initialize word, word pointer
MOVE BPREG,[POINT 6,REG1]
LUTWR1: ILDB REG2,IOREG ; get a character from buffer
CAIE REG2,":"
CAIN REG2,";"
JRST RETN(0)
CAIN REG2," "
JRST RETN(0)
JUMPE REG2,RETN(0)
SUBI REG2," " ; SIXBITify from ASCII
TRNN REG1,77 ; and save in word until word filled
IDPB REG2,BPREG
JRST LUTWR1
-3613: ENDR
-3617,3657
MOVLN: BEGINR <UTIL>
CALLR LOCS ; get length of file
MOVEM UTIL,MOVSPA
SETZM MOVSUM
.RDTIM REG1,
IDIVI REG1,↑D30
MOVEM REG1,MOVTIM
MOVLN1: MOVE REG1,[-2000,,IOBUFR]
.IOT LCI,REG1 ; read 1K from local file
JUMPL REG1,MOVLN2 ; hit EOF here
MOVE REG1,[-2000,,IOBUFR]
.IOT DDO,REG1
MOVSI REG1,-2000 ; compute checksum
MOVE REG2,IOBUFR(REG1)
ADDM REG2,MOVSUM
AOBJN REG1,.-2
JRST MOVLN1
MOVLN2: MOVEI REG1,-IOBUFR(REG1) ; get # of words transferred
JUMPE REG1,MOVLN3
MOVNS REG1
HRLZS REG1
PUSH STAK,REG1
HRRI REG1,IOBUFR
.IOT DDO,REG1
POP STAK,REG1
MOVE REG2,IOBUFR(REG1)
ADDM REG2,MOVSUM
AOBJN REG1,.-2
MOVLN3: .RDTIM REG1,
IDIVI REG1,↑D30
SUBM REG1,MOVTIM
-3663,3817
SETZM MOVSPA
SETZM MOVSUM
.RDTIM REG1,
IDIVI REG1,↑D30
MOVEM REG1,MOVTIM
MOVNL1: MOVE REG1,[-2000,,IOBUFR]
.IOT DDI,REG1 ; read 1K from DATACOMPUTER
JUMPL REG1,MOVNL2 ; hit EOF here
MOVEI REG1,2000
ADDM REG1,MOVSPA
MOVE REG1,[-2000,,IOBUFR]
.IOT LCO,REG1
MOVSI REG1,-2000 ; compute checksum
MOVE REG2,IOBUFR(REG1)
ADDM REG2,MOVSUM
AOBJN REG1,.-2
JRST MOVNL1
MOVNL2: MOVEI REG1,-IOBUFR(REG1) ; get # of words transferred
JUMPE REG1,MOVLN3
ADDM REG1,MOVSPA
MOVNS REG1
HRLZS REG1
PUSH STAK,REG1
HRRI REG1,IOBUFR
.IOT LCO,REG1
POP STAK,REG1
MOVE REG2,IOBUFR(REG1)
ADDM REG2,MOVSUM
AOBJN REG1,.-2
MOVNL3: .RDTIM REG1,
IDIVI REG1,↑D30
SUBM REG1,MOVTIM
ENDR
; MOVV -- VERIFY (WORD-BY-WORD COMPARE)
;
MOVV: BEGINR <IOREG,UTIL,FLAG>
SETZB UTIL,FLAG
SETZM MOVSUM
MOVV0: MOVE REG1,[-1000,,IOBUFR]
.IOT DDI,REG1
MOVE REG2,[-1000,,IOBUFR+1000]
.IOT LCI,REG2
HLLZ REG3,REG1
HLLZ REG4,REG2
MOVV1: MOVEI REG1,-IOBUFR(REG1)
JUMPE REG1,MOVV2
SETZ REG2,
MOVV01: CAIN FLAG,0
ADDI UTIL,1
MOVE IOREG,IOBUFR(REG2)
ADDM IOREG,MOVSUM
CAME IOREG,IOBUFR+1000(REG2)
ADDI FLAG,1
ADDI REG2,1
SOJG REG1,MOVV01
CAMN REG3,REG4 ; file sizes match?
JRST MOVV0
CAML REG3,REG4 ; DATACOMPUTER file smaller?
JRST MOVV4
JRST MOVV5 ; no
MOVV2: JUMPN FLAG,MOVV3
TSOUT <[ASCIZ / [OK]/],CRLF>
RETURN
MOVV3: CAIE FLAG,1
JRST MOVV3A
TSOUT <[ASCIZ / (There is one different word at /]>
JRST MOVV03
MOVV3A: TSOUT <[ASCIZ / (There are /]>
TNOUT <FLAG>
TSOUT <[ASCIZ / different words. The first difference is at /]>
MOVV03: TNOUT <UTIL>
TSOUT <[ASCIZ /.)/],CRLF>
RETURN
MOVV4: MOVE REG1,[-1000,,IOBUFR]
.IOT DDI,REG1 ; it gets upset if you don't read everything
MOVEI REG2,-IOBUFR(REG1)
JUMPE REG2,MOVV04
MOVE IOREG,IOBUFR-1(REG2)
ADDM IOREG,MOVSUM
SOJG REG2,.-2
JUMPL REG1,MOVV04
JRST MOVV4
MOVV04: TSOUT <[ASCIZ / (The datacomputer file is larger than the local file.)/],CRLF>
RETURN
MOVV5: TSOUT <[ASCIZ / (The local file is larger than the datacomputer file.)/],CRLF>
ENDR
-3821,3822
; (((TOPS-10)))
IFE F.TENX,<
-3826,3843
MOVE 0,[SIXBIT/DFTP/]
SETNAM 0,
OPEN 0,[ 200 ; TURN OFF TTY ECHOING
SIXBIT /TTY/
0]
THUD
-3847,3924
; TOPS-10 ICP: 1) SET CONNECTION SOCKETS IN LISTENING STATE
; 2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 3) OPEN CONNECTION SOCKETS
; A) EVEN - RECEIVE
; B) ODD - SEND
;
ICP: BEGINR <IOREG,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG: SETZM ICPBLK+.IBDEV
SETZM DCIBLK+.IBDEV
SETZM DCOBLK+.IBDEV
SETZM DCIBLK+.IBRMT
SETZM DCOBLK+.IBRMT
MOVE IOREG,LINP ; LISTEN ON INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST .+2
JRST ICPICP
MOVE IOREG,DCIBLK+.IBERR
CAIE IOREG,.IESKT
JRST ICPEIL
MOVE IOREG,PWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
LDB REG4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,102
SETZ REG3,
SETZ FLAG,
ICPRDV: MOVE IOREG,[SIXBIT/IMP/] ; RESET DEVICE(S) USED
MOVEM IOREG,WRKBLK+.IBDEV
MOVEI REG1,(REG3)
IDIVI REG1,10
JUMPE REG1,ICPRD1
ADDI REG1,20
ADDI REG2,20
DPB REG1,[140600,,WRKBLK+.IBDEV]
DPB REG2,[060600,,WRKBLK+.IBDEV]
JRST ICPRD2
ICPRD1: ADDI REG2,20
DPB REG2,[140600,,WRKBLK+.IBDEV]
ICPRD2: SETZM WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/] ; TEST STATUS OF SOCKET
JRST ICPRD3
HRRZ IOREG,WRKBLK+.IBHST ; FOREIGN HOST
CAIE IOREG,DCHOST
JRST ICPRD3
PJOB REG1,
HLRZ REG2,WRKBLK+.IBSTT ; OWNING JOB
CAIE REG2,(REG1)
JRST ICPRD3
MOVE IOREG,WRKBLK+.IBLCL
CAMN IOREG,UTIL ; DATALANGUAGE SOCKET(S)
JRST ICPCLS
SUBI IOREG,2
CAMN IOREG,UTIL ; INPUT DATA SOCKET
JRST ICPCLI
ICPRD3: MOVEI IOREG,1 ; OUTPUT DATA SOCKET
MOVEM IOREG,WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
HRRZ IOREG,WRKBLK+.IBHST
CAIE IOREG,DCHOST
JRST ICPRD4
PJOB REG1,
HLRZ REG2,WRKBLK+.IBSTT
CAIE REG2,(REG1)
JRST ICPRD4
MOVE IOREG,WRKBLK+.IBLCL
SUBI IOREG,3
CAMN IOREG,UTIL
JRST ICPCLO
ICPRD4: ADDI REG3,1
CAIGE REG3,(REG4)
JRST ICPRDV
JUMPN FLAG,ICPBEG
TTCALL 3,[ASCIZ / (Connections in use.)/]
EXIT
ICPCLS: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVEI IOREG,1
MOVEM IOREG,WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ / [Restarting]
/]
SETO FLAG,
JRST ICPRDV
ICPCLI: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ / (Retrieve interrupted: connection closed.)
/]
JRST ICPRDV
ICPCLO: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ / (Store interrupted: connection closed.)
/]
JRST ICPRDV
ICPICP: MOVE IOREG,DCIBLK+.IBDEV ; GET DEVICE NAME
MOVEM IOREG,DCOBLK+.IBDEV ; AND COPY IT FOR DUPLEX
MOVEM IOREG,DCCHAS+1
MOVE IOREG,LOUT ; LISTEN ON OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPEOL
MOVE IOREG,OICP
CALL IOREG,[SIXBIT/IMPUUO/] ; OPEN CONNECTION
JRST ICPEC
MOVE IOREG,ICPBLK+.IBDEV ; GET DEVICE NAME
MOVEM IOREG,ICCHAS+1
OPEN DCCHAN,ICCHAS ; OPEN AS STANDARD DEVICE
JRST ICPEF
IN DCCHAN,
JRST .+2
JRST ICPET
MOVE IOREG,ICPBUF+1
MOVE IOREG,1(IOREG) ; GET THE SOCKET NUMBER
LSH IOREG,-4 ; RIGHT JUSTIFY 32 BITS
MOVEM IOREG,DCOBLK+.IBRMT
AOJ IOREG,
MOVEM IOREG,DCIBLK+.IBRMT
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
MOVE IOREG,OINP ; OPEN INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEIC
MOVE IOREG,OOUT ; OPEN OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEOC
OPEN DCCHAN,DCCHAS
JRST NETECF
OUT DCCHAN,
JRST .+2
JRST NETEOT
MOVE IOREG,PWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST QUIT
HRRZ IOREG,WRKBLK+.IBHST
MOVEM IOREG,LHOST
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
; POSITIONS IN MTAPE BLOCK
STLOC==1 ; STATUS BITS RETURNED HERE
LSLOC==2 ; LOCAL SOCKET
WFLOC==3 ; WAIT FLAG
BSLOC==4 ; BYTE SIZE LOCATION
FSLOC==5 ; FOREIGN SOCKET
HLOC==6 ; HOST NUMBER
ERRBTS==763600 ; I/O ERROR BITS
ICPBEG: ; Tovar says this is the right thing to do - MRC
PJOB REG2, ; GET JOB #
MOVSS REG4,REG2 ; RECEIVE SOCKET
ADDI REG4,1 ; TRANSMIT SOCKET
MOVEI REG1,13 ; SAIL'S HOST ADDRESS NUMBER
MOVEM REG1,LHOST ; SAVE IT AWAY
INIT DCCHAN,17
SIXBIT /IMP/
0
JRST ICPLUZ
SETZM CONECB
MOVEM REG2,CONECB+LSLOC
MOVEI REG3,DCHOST
MOVEM REG3,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI REG3,40
MOVEM REG3,CONECB+BSLOC
MOVEI REG3,DCSOKT
MOVEM REG3,CONECB+FSLOC
MTAPE DCCHAN,[
↑D15
BYTE (6) 2,24,0,12,12
] ; TIME OUT CLS, RFNM, RFC, AND INPUT
MTAPE DCCHAN,CONECB
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; NO CONNECTION TO LOGGER
INPUT DCCHAN,[IOWD 1,FRS#
0]
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
MOVE REG3,FRS
LSH REG3,-4
MOVEM REG3,FRS
ADDI REG3,1
MOVEM REG3,FSS#
ADDI REG2,2
MOVEM REG2,LRS#
ADDI REG4,2
MOVEM REG4,LSS#
MOVE REG1,CONECB+LSLOC
MOVEM REG1,TERBLK+LSLOC
MTAPE DCCHAN,TERBLK ; RELEASE LOGGER
INIT DCCHAN,1
SIXBIT /IMP/
XWD DCOBUF,DCIBUF
JRST ICPLUZ
MTAPE DCCHAN,[
↑D15
BYTE (6) 5,24,0,12,0
] ; TIME OUT CLS, RFNM, AND RFC
MOVEI REG1,↑D8
DPB REG1,[POINT 6,DCIBUF+1,11]
DPB REG1,[POINT 6,DCOBUF+1,11]
MOVEM REG2,CONECB+LSLOC
MOVEI REG3,DCHOST
MOVEM REG3,CONECB+HLOC
SETZM CONECB+WFLOC
MOVEI REG3,↑D8
MOVEM REG3,CONECB+BSLOC
MOVE REG3,FSS
MOVEM REG3,CONECB+FSLOC
MTAPE DCCHAN,CONECB
MOVE REG1,CONECB+STLOC
TRNN REG1,-1
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; CAN'T CONNECT TO RECEIVE SIDE
CALLR CLSCHK ; SEE IF WE ARE REALLY OPEN
JRST ICPLUZ
AOS CONECB+LSLOC
SOS CONECB+FSLOC
MOVEI REG3,↑D8
MOVEM REG3,CONECB+BSLOC
MTAPE DCCHAN,CONECB
MOVE REG1,CONECB+STLOC
TRNN REG1,-1
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; CAN'T CONNECT TO SEND SIDE
CALLR CLSCHK
JRST ICPLUZ
MOVEI REG3,4
MOVEM REG3,CONECB
MTAPE DCCHAN,CONECB
MOVE REG1,CONECB+STLOC
TLC REG1,300000
TLCN REG1,300000
TLNE REG1,060000
JRST ICPLUZ
STATZ DCCHAN,ERRBTS
JRST ICPLUZ
SOS CONECB+LSLOC
CALLR CLSCHK
JRST ICPLUZ
MTAPE DCCHAN,CONECB
MOVE REG1,CONECB+STLOC
TLC REG1,300000
TLCN REG1,300000
TLNE REG1,060000
JRST ICPLUZ
STATZ DCCHAN,ERRBTS
JRST ICPLUZ ; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
CALLR CLSCHK
JRST ICPLUZ
RETURN
; HERE WHEN CONNECTION FAILS
ICPLUZ: OUTSTR [ASCIZ/? Cannot establish network connection/]
EXIT
>
; (((↑↑↑)))
ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT: MOVEI IOREG,"Z"-100
IDPB IOREG,DCOBUF+1
OUT DCCHAN,
JRST .+1
QUIT01: INPUT DCCHAN,
STATZ DCCHAN,20000
JRST QUIT02
SKIPE FLAGDD
CALLR NUTDD
JRST QUIT01
QUIT02: RELEAS DCCHAN, ; RELEASE INPUT/OUTPUT DEVICE
QUIT03: IFE F.SAIL,<
MOVE IOREG,COUT ; CLOSE OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEOC
>
QUIT04: IFE F.SAIL,<
MOVE IOREG,CINP ; CLOSE INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEIC
>
EXIT
-3925:
-3929,3955
IFN F.SAIL,<
OPEN DDCHAN,DDCHAS
JRST NETOI2
SETZM CONECB
MOVE REG1,LRS
ADDI REG1,2
MOVEM REG1,CONECB+LSLOC
MOVEI REG1,DCHOST
MOVEM REG1,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI REG1,↑D36
MOVEM REG1,CONECB+BSLOC
MOVE REG1,FSS
ADDI REG1,2
MOVEM REG1,CONECB+FSLOC
MTAPE DDCHAN,CONECB
STATZ DDCHAN,ERRBTS
JRST NETOI2
RETURN SKIP,1
>
IFE F.SAIL,<
SETZM DCDBLK+.IBDEV
MOVEI REG1,104
MOVEM REG1,DCDBLK+.IBLCL
MOVE REG1,DCIBLK+.IBRMT
ADDI REG1,2
MOVEM REG1,DCDBLK+.IBRMT
MOVE REG1,ODAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOI2
MOVE REG1,DCDBLK+.IBDEV
MOVEM REG1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOI1
RETURN SKIP,1
NETOI1: MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOI2
>
NETOI2: TTCALL 3,[ASCIZ / ?? Network connection OPEN failure ??
/]
-3961,3987
IFN F.SAIL,<
OPEN DDCHAN,DDCHAS
JRST NETOO2
SETZM CONECB
MOVE REG1,LSS
ADDI REG1,2
MOVEM REG1,CONECB+LSLOC
MOVEI REG1,DCHOST
MOVEM REG1,CONECB+HLOC
SETOM CONECB+WFLOC
MOVEI REG1,↑D36
MOVEM REG1,CONECB+BSLOC
MOVE REG1,FRS
ADDI REG1,2
MOVEM REG1,CONECB+FSLOC
MTAPE DDCHAN,CONECB
STATZ DDCHAN,ERRBTS
JRST NETOO2
RETURN SKIP,1
>
IFE F.SAIL,<
SETZM DCDBLK+.IBDEV
MOVEI REG1,105
MOVEM REG1,DCDBLK+.IBLCL
MOVE REG1,DCOBLK+.IBRMT
ADDI REG1,2
MOVEM REG1,DCDBLK+.IBRMT
MOVE REG1,ODAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOO2
MOVE REG1,DCDBLK+.IBDEV
MOVEM REG1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOO1
RETURN SKIP,1
NETOO1: MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOO2
>
NETOO2: TTCALL 3,[ASCIZ / ?? Network connection OPEN failure ??
/]
-3993,3999
RELEAS DDCHAN,
IFE F.SAIL,<
MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETC1
RETURN
NETC1: TTCALL 3,[ASCIZ / ?? Network connection CLOSE failure ??
/]
>
-4006,4009
IFN F.SAIL,<MOVE UTIL,LRS
ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,104>
-4016,4019
IFN F.SAIL,<MOVE UTIL,LSS
ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,105>
ENDR
; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI: BEGINR
IN DCCHAN,
JRST .+2
JRST NETEIT
SKIPE FLAGDD
CALLR NUTDD
ENDR
; NETWORK UTILITY -- MESSAGE OUTPUT
; IN: REG1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO: BEGINR <IOREG,BPREG>
SKIPE FLAGDD
OUTSTR (REG1)
MOVEI BPREG,(REG1)
HRLI BPREG,440700
NUTMOL: ILDB IOREG,BPREG
JUMPE IOREG,RETN(0)
SKIPE DCOBUF+2
JRST NUTMOB
NUTMOO: OUT DCCHAN,
JRST .+2
JRST NETEOT
NUTMOB: SOS DCOBUF+2
IDPB IOREG,DCOBUF+1
JRST NUTMOL
ENDR
; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD: BEGINR <IOREG,UTIL>
MOVE REG1,DCIBUF+1
MOVE UTIL,DCIBUF+2
NUTDDL: SOJL UTIL,RETN(0)
ILDB IOREG,REG1
JUMPE IOREG,NUTDDL
TTCALL 1,IOREG
JRST NUTDDL
-4020: ENDR
-4024,4041
IFE F.SAIL,<
ICPERD: TTCALL 3,[ASCIZ / ?? Restart failure ??/]
EXIT
ICPEIL: TTCALL 3,[ASCIZ / ?? Input socket listen failure ??/]
EXIT
ICPEOL: TTCALL 3,[ASCIZ / ?? Output socket listen failure ??/]
JRST QUIT04
ICPET: TTCALL 3,[ASCIZ / ?? ICP failure (transfer) ??/]
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
ICPEZ: MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
JRST QUIT03
ICPEF: TTCALL 3,[ASCIZ / ?? ICP failure (file control) ??/]
JRST ICPEZ
ICPEC: TTCALL 3,[ASCIZ / The datacomputer is unavailable/]
MOVE 0,ICPBLK+.IBERR
CAIN 0,.IESOF ; SOCKET OPEN FAILURE
TTCALL 3,[ASCIZ / (rejecting)/]
CAIN 0,.IEDWN
TTCALL 3,[ASCIZ / (down)/]
CAIN 0,.IETIM
TTCALL 3,[ASCIZ / (timeout)/]
TTCALL 3,[ASCIZ /.
/]
MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/]
JRST QUIT03
JRST QUIT03
NETEIC: TTCALL 3,[ASCIZ / ?? Input failure (connection) ??/]
EXIT
NETEOC: TTCALL 3,[ASCIZ / ?? Output failure (connection) ??/]
JRST QUIT04
NETECF: TTCALL 3,[ASCIZ / ?? File control failure ??/]
JRST QUIT03
>
NETEIT: TTCALL 3,[ASCIZ / ?? Input failure (transfer) ??/]
JRST QUIT
NETEOT: TTCALL 3,[ASCIZ / ?? Output failure (transfer) ??/]
JRST QUIT
IFE F.SAIL,<
OICP: .IUCON,,ICPBLK
CICP: .IUCLS,,ICPBLK
LINP: .IULSN,,DCIBLK
OINP: .IUCON,,DCIBLK
CINP: .IUCLS,,DCIBLK
LOUT: .IULSN,,DCOBLK
OOUT: .IUCON,,DCOBLK
COUT: .IUCLS,,DCOBLK
ODAT: 001000+.IUCON,,DCDBLK ; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT: .IUCLS,,DCDBLK
PWRK: .IULHS,,WRKBLK
SWRK: .IUSTT,,WRKBLK
CWRK: .IUCLS,,WRKBLK
>
;(((SAIL)))
IFN F.SAIL,<
; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME
CLSCHK: BEGINR
MTAPE DCCHAN,STTBLK
MOVE REG1,STTBLK+1
IOR REG1,STTBLK+2
STATO DCCHAN,ERRBTS
TLNN REG1,060000
RETURN SKIP,1
ENDR
>
;(((↑↑↑↑)))
-4046,4064
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOI1
LOOKUP LFCHAN,LFILE ; PREPARE FILE FOR INPUT
JRST LOCOI2
RETURN SKIP,1
LOCOI1: TTCALL 3,[ASCIZ / ?? Local channel OPEN failure ??
/]
RELEAS LFCHAN,
RETURN
LOCOI2: TTCALL 3,[ASCIZ / (Local file not found.)
/]
RELEAS LFCHAN,
-4069,4084
LOCOO: BEGINR <IOREG,<IOREG+1>>
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS
JRST LOCOO2
MOVE IOREG,<LFILE+1>
MOVE <IOREG+1>,<LFILE+2>
LOOKUP LFCHAN,LFILE
JRST LOCOO1
TAIN <[ASCIZ / [Old Local File][Confirm]/]>
JRST .+3
JRST .+2
JRST LOCOO1
RELEAS LFCHAN,
RETURN
LOCOO1: RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOO2
MOVEM IOREG,<LFILE+1>
MOVEM <IOREG+1>,<LFILE+2>
ENTER LFCHAN,LFILE ; PREPARE FILE FOR OUTPUT
JRST LOCOO2
RETURN SKIP,1
LOCOO2: TTCALL 3,[ASCIZ / ?? Local file creation failure ??
/]
RELEAS LFCHAN,
-4090,4096
RELEAS LFCHAN,
-4103,4159
SKIPL LFILE+3
JRST LOCS1
HLRO UTIL,LFILE+3 ; SIZE IN WORDS
MOVN UTIL,UTIL
RETURN
LOCS1: HLRZ UTIL,LFILE+3 ; SIZE IN BLOCKS
IMULI UTIL,SIZBLK
ENDR
; LOCDG -- LOCAL FILE CREATION DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG: BEGINR <BPREG,UTIL>
MOVE BPREG,[440700,,GBUF1]
ILDB UTIL,BPREG
JUMPE UTIL,RETN(0)
CAIN UTIL," "
MOVEI UTIL,"0"
MOVEI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
ILDB UTIL,BPREG
CAIE UTIL,"-"
RETURN
MOVE REG2,[440700,,REG3]
SETZ REG3,
ILDB UTIL,BPREG
IDPB UTIL,REG2
ILDB UTIL,BPREG
IDPB UTIL,REG2
ILDB UTIL,BPREG
IDPB UTIL,REG2
MOVEI REG2,↑D11
CAMN REG3,LOCDM(REG2)
JRST .+3
SOJGE REG2,.-2
RETURN
ILDB UTIL,BPREG
CAIE UTIL,"-"
RETURN
ILDB UTIL,BPREG
MOVEI REG3,-"0"(UTIL)
IMULI REG3,↑D10
ILDB UTIL,BPREG
ADDI REG3,-"0"(UTIL)
SUBI REG3,↑D64
IMULI REG3,↑D12
ADDI REG3,(REG2)
IMULI REG3,↑D31
ADDI REG3,-1(REG1)
ILDB UTIL,BPREG
CAIE UTIL," "
RETURN
ILDB UTIL,BPREG
MOVEI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,6
ILDB UTIL,BPREG
CAIE UTIL,":"
RETURN
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
DPB REG3,[001400,,LFILE+2]
LSH REG3,-14
DPB REG3,[170300,,LFILE+1]
DPB REG1,[141300,,LFILE+2]
ENDR
; LOCDP -- LOCAL FILE CREATION DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP: BEGINR
MOVE REG1,[440700,,GBUF1]
LDB REG2,[001400,,LFILE+2] ; CREATION DATE
LDB REG3,[170300,,LFILE+1]
LSH REG3,14
IORI REG2,(REG3)
IDIVI REG2,↑D31
MOVEI REG4,(REG2)
MOVEI REG2,1(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
CAIN REG2,"0"
MOVEI REG2," "
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2,"-"
IDPB REG2,REG1
MOVEI REG2,(REG4)
IDIVI REG2,↑D12
MOVEI REG4,(REG2)
HRRI REG2,LOCDM(REG3)
HRLI REG2,440700
SCOPY (REG2,REG1)
MOVEI REG2,"-"
IDPB REG2,REG1
MOVEI REG2,↑D64(REG4)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2," "
IDPB REG2,REG1
LDB REG2,[141300,,LFILE+2] ; CREATION TIME
IDIVI REG2,↑D60
MOVEI REG4,(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2,":"
IDPB REG2,REG1
MOVEI REG2,(REG4)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
SETZ REG2,
IDPB REG2,REG1
ENDR
; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LOCDM: ASCII /JAN/
ASCII /FEB/
ASCII /MAR/
ASCII /APR/
ASCII /MAY/
ASCII /JUN/
ASCII /JUL/
ASCII /AUG/
ASCII /SEP/
ASCII /OCT/
ASCII /NOV/
ASCII /DEC/
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN: BEGINR <IOREG,BPREG,UTIL>
HRRI BPREG,(IOREG)
HRLI BPREG,440700
SETZM LFILE ; CLEAR OLD FILE NAME
SETZM LFILE+1 ; AND EXTENSION
SETZM LFILE+2
SETZM LFILE+3
MOVEI REG1,LUTFNT ; INITIALIZE XCT PNTR
MOVEI REG2,LFILE ; SET DESTINATION OF IOR
SETZ UTIL,
LUTFN1: ILDB IOREG,BPREG
JUMPE IOREG,RETN(0)
CAIN IOREG,"." ; PREPARE FOR FILE EXTENSION IF "."
JRST LUTFN2
CAILE UTIL,5
JRST LUTFN1
ADDI IOREG,40 ; CONVERT TO SIXBIT BY ADDITION
ANDI IOREG,77 ; AND REMOVAL OF HIGH BITS
XCT (REG1) ; EXECUTE THE PROPER ROTATE
IORM IOREG,(REG2) ; IOR RESULT INTO FILE OR FILE+1
AOJ REG1, ; INCREMENT THE XCT PNTR
AOJA UTIL,LUTFN1
LUTFN2: CAIN REG2,LFILE+1
JRST RETN(0) ; IGNORE MULTIPLE EXTENSIONS
MOVEI REG1,LUTFNT ; RESET PNTRS FOR EXTENSION
MOVEI REG2,LFILE+1
MOVEI UTIL,3
JRST LUTFN1
LUTFNT: ROT IOREG,-6 ; HIGH ORDER
ROT IOREG,-14
ROT IOREG,22
ROT IOREG,14
ROT IOREG,6
ROT IOREG,0 ; LOW ORDER
ENDR
; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
IFE F.SAIL,<
LUTDS: BEGINR
SKIPN LUTDSP
JRST LUTDSS
MOVE REG1,LUTDSP
SKIPN (REG1)
JRST LUTDSI
LUTDS1: MOVNI REG2,2
ADDM REG2,LDIBUF+2
SKIPGE LDIBUF+2
JRST LUTDSI
MOVE REG3,[440700,,ABUF]
HRLI REG1,440600
MOVEI REG2,6
LUTDS2: ILDB REG4,REG1
JUMPE REG4,LUTDS3
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,LUTDS2
LUTDS3: ADDI REG1,1
LDB REG4,[222200,,(REG1)]
JUMPE REG4,LUTDS5
MOVEI REG4,"."
IDPB REG4,REG3
HRLI REG1,440600
MOVEI REG2,3
LUTDS4: ILDB REG4,REG1
JUMPE REG4,LUTDS5
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,LUTDS4
LUTDS5: SETZ REG4,
IDPB REG4,REG3
ADDI REG1,1
HRRZM REG1,LUTDSP
RETURN SKIP,1
LUTDSS: RELEAS LDCHAN,
GETPPN REG1,
MOVEM REG1,LDIR
MOVE REG1,[SIXBIT/UFD/]
MOVEM REG1,LDIR+1
SETZM LDIR+2
MOVE REG1,[1,,1]
MOVEM REG1,LDIR+3
OPEN LDCHAN,LDCHAS
JRST LUTDSE
LOOKUP LDCHAN,LDIR
JRST LUTDSE
IN LDCHAN,
JRST .+2
JRST LUTDSE
HRRZ REG1,LDIBUF
ADDI REG1,2
SKIPE (REG1)
JRST LUTDS1
TTCALL 3,[ASCIZ / (No local files.)
/]
RELEAS LDCHAN,
RETURN
LUTDSI: IN LDCHAN,
JRST .+2
JRST LUTDSD
HRRZ REG1,LDIBUF
ADDI REG1,2
SKIPE (REG1)
JRST LUTDS1
RELEAS LDCHAN,
RETURN
LUTDSD: STATO LDCHAN,20000
LUTDSE: TTCALL 3,[ASCIZ / ?? Local directory failure ??
/]
RELEAS LDCHAN,
ENDR
>
-4160:
-4163,4163
MOVLN: BEGINR <UTIL>
-4167,4201
MSTIME REG1,
IDIVI REG1,↑D1000
MOVEM REG1,MOVTIM
MOVLN1: SOSG LFIBUF+2 ;TRADITIONAL WAY, SINCE HACKING
IN LFCHAN, ;BUFFERS IS ASKING FOR TROUBLE!!
CAIA
JRST MOVLN2
ILDB REG1,LFIBUF+1
ADDM REG1,MOVSUM
SOSG DDOBUF+2
OUT DDCHAN,
CAIA
THUD
IDPB REG1,DDOBUF+1
JRST MOVLN1
MOVLN2: STATO LFCHAN,20000
THUD
MSTIME REG1,
IDIVI REG1,↑D1000
MOVE REG2,MOVTIM
CAMGE REG1,REG2
ADDI REG1,<↑D24*↑D60*↑D60>
SUB REG1,REG2
MOVEM REG1,MOVTIM
-4206,4237
MOVNL: BEGINR
SETZM MOVSUM
SETZM MOVSPA
MSTIME REG1,
IDIVI REG1,↑D1000
MOVEM REG1,MOVTIM
MOVNL1: SOSG DDIBUF+2
IN DDCHAN,
CAIA
JRST MOVNL2
ILDB REG1,DDIBUF+1
AOS MOVSPA
ADDM REG1,MOVSUM
SOSG LFOBUF+2
OUT LFCHAN,
CAIA
THUD
IDPB REG1,LFOBUF+1
JRST MOVNL1
MOVNL2: STATO DDCHAN,20000
THUD
MSTIME REG1,
IDIVI REG1,↑D1000
MOVE REG2,MOVTIM
CAMGE REG1,REG2
ADDI REG1,<↑D24*↑D60*↑D60>
SUB REG1,REG2
MOVEM REG1,MOVTIM
-4245,4348
SETZM MOVSUM
IN DDCHAN,
JRST .+2
THUD
IN LFCHAN,
JRST .+2
JRST MOVV4
MOVV1: CAIN FLAG,0
ADDI UTIL,1
SKIPLE LFIBUF+2
JRST .+4
IN LFCHAN,
JRST .+2
JRST MOVV2
SOS LFIBUF+2
AOS LFIBUF+1
MOVE IOREG,@<LFIBUF+1>
SKIPLE DDIBUF+2
JRST .+4
IN DDCHAN,
JRST .+2
JRST MOVV5
SOS DDIBUF+2
AOS DDIBUF+1
MOVE REG1,@<DDIBUF+1>
ADDM REG1,MOVSUM
CAMN IOREG,REG1
JRST MOVV1
AOJA FLAG,MOVV1
MOVV2: STATO LFCHAN,20000
THUD
SKIPLE DDIBUF+2
JRST MOVV4
IN DDCHAN,
JRST MOVV4
STATO DDCHAN,20000
THUD
JUMPN FLAG,MOVV3
TTCALL 3,[ASCIZ / [OK]
/]
RETURN
MOVV3: CAIE FLAG,1
JRST .+3
TTCALL 3,[ASCIZ / (There is one different word at /]
JRST MOVV03
TTCALL 3,[ASCIZ / (There are /]
TNOUT <FLAG>
TTCALL 3,[ASCIZ / different words, with the first difference at /]
MOVV03: TNOUT <UTIL>
TTCALL 3,[ASCIZ /.)
/]
RETURN
MOVV4: SKIPLE DDIBUF+2
JRST .+4
IN DDCHAN,
JRST .+2
JRST MOVV04
SOS DDIBUF+2
AOS DDIBUF+1
MOVE REG1,@<DDIBUF+1>
ADDM REG1,MOVSUM
JRST MOVV4
MOVV04: STATO DDCHAN,20000
THUD
TTCALL 3,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
RETURN
MOVV5: STATO DDCHAN,20000
THUD
TTCALL 3,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
ENDR
-4352,4435
; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE REG1,[SIXBIT/DFTP/]
SETNM
HRRZI REG1,-1
RFMOD
TRZ REG2,006000 ; (1B24+1B25)
SFMOD
MOVE REG2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
MOVE REG3,[252525,,253000] ; AND EOL'S (NO NULLS)
SFCOC
MOVEI REG1,400000 ; FOR THIS FORK
MOVE REG2,[LEVTAB,,CHNTAB]
SIR ; SET UP INTERRUPT TABLES
EIR ; ENABLE INTERRUPTS
MOVE REG1,[17,,0] ; ↑O ON CHANNEL 0
ATI
MOVEI REG1,400000 ; FOR THIS FORK
MOVE REG2,[1B0+1B10+1B15] ; TTY, EOF, ILI
AIC ; ACTIVATE CHANNELS
CALLR ICP
ENDR
; TENEX ICP: 1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 2) OPEN CONNECTION SOCKETS
; A) EVEN - INPUT
; B) ODD - OUTPUT
; JFN STRING: "NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP: BEGINR
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:20./]
SETZ REG3,
SOUT ; LOCAL SOCKET 20+JOBREL
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT ; FAILURE -- MAKE HOST # INTO STRING
JRST .+1 ; CVHST SUCCESS OR NOUT FAILURE
MOVN REG2,DCSOCK
NOUT
JRST .+1
HRLZI REG1,1 ; SHORT GTJFN
HRROI REG2,UBUF1
GTJFN ; ICP CONNECTION
JRST ICPEG
MOVE REG2,[40B5+1B19] ; 32-BIT, READ
OPENF ; OPEN ICP CONNECTION
JRST ICPEO
BIN
MOVEM REG2,ICPSOC
CLOSF
JRST ICPEC
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:22./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN ; OUTPUT JFN
JRST ICPEIG
MOVEM REG1,DCOJFN
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN ; INPUT JFN
JRST ICPEOG
MOVEM REG1,DCIJFN
MOVE REG2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
OPENF
JRST ICPEIO
MOVE REG1,DCOJFN
MOVE REG2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST ICPEOO
MOVE REG1,[SIXBIT/LHOSTN/]
SYSGT
MOVEM REG1,LHOST
ENDR
; NETWORK QUIT
;
QUIT: MOVE REG1,DCOJFN
MOVEI REG2,"Z"-100
BOUT
MOVEI REG2,21
MTOPR
SETOM FLAGEF
QUIT01: DCBIN <IOREG>
SKIPE FLAGEF
JRST QUIT01
RESET
HALTF
JRST .-1 ; IN CASE OF "CONTINUE"
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:24./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
SUBI REG2,3
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN
JRST NETOI2
MOVEM REG1,DCDJFN
MOVE REG2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
OPENF
JRST NETOI1
RETURN SKIP,1
NETOI1: RLJFN
JRST NETOI2
NETOI2: HRROI REG1,[ASCIZ / ?? Network connection OPEN failure ??
/]
PSOUT
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:25./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
SUBI REG2,2
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN
JRST NETOO2
MOVEM REG1,DCDJFN
MOVE REG2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST NETOO1
RETURN SKIP,1
NETOO1: RLJFN
JRST NETOO2
NETOO2: HRROI REG1,[ASCIZ / ?? Network connection OPEN failure ??
/]
PSOUT
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
MOVE REG1,DCDJFN
CLOSF
JRST NETC1
RETURN
NETC1: HRROI [ASCIZ / ?? Network connection CLOSE failure ??
/]
PSOUT
ENDR
; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
; OUT: UTIL
;
NETNI: BEGINR
GJINF
HRRZI UTIL,(REG2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,24
ENDR
; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
; OUT: UTIL
;
NETNO: BEGINR
GJINF
HRRZI UTIL,(REG2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,25
ENDR
; FATAL NETWORK ERROR MESSAGES
;
NETEQ: PSOUT
RESET
HALTF
JRST .-1
ICPEG: HRROI REG1,[ASCIZ / The datacomputer is unavailable (network)./]
JRST NETEQ
ICPEO: HRROI REG1,[ASCIZ / The datacomputer is unavailable (down)./]
JRST NETEQ
ICPEC: HRROI REG1,[ASCIZ / ?? ICP CLOSF failure ??/]
JRST NETEQ
ICPEOG: HRROI REG1,[ASCIZ / ?? ICP output GTJFN failure ??/]
JRST NETEQ
ICPEIG: HRROI REG1,[ASCIZ / ?? ICP input GTJFN failure ??/]
JRST NETEQ
ICPEIO: HRROI REG1,[ASCIZ / ?? ICP output OPENF failure ??/]
JRST NETEQ
ICPEOO: HRROI REG1,[ASCIZ / ?? ICP input OPENF failure ??/]
JRST NETEQ
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
HRLZI REG1,100001 ; OLD FILE, SHORT CALL
MOVE REG2,[440700,,LFILE]
GTJFN
JRST LOCOI1
HRRZM REG1,LJFN
MOVE REG2,[440000,,200000] ; 36-BIT, READ
OPENF
JRST LOCOI2
RETURN SKIP,1
LOCOI1: HRROI REG1,[ASCIZ / (Local file not found.)
/]
PSOUT
RETURN
LOCOI2: HRROI REG1,[ASCIZ / (Local file not available.)
/]
PSOUT
MOVE REG1,LJFN
RLJFN
RETURN
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR
HRLZI REG1,600001 ; VN, WRITE, SHORT
MOVE REG2,[440700,,LFILE]
GTJFN
JRST LOCOO2
HRRZM REG1,LJFN
MOVE REG2,[440000,,100000] ; 36 BIT BYTE, READ
OPENF
JRST LOCOO1
RETURN SKIP,1
LOCOO1: MOVE REG1,LJFN
RLJFN
JRST .+1
LOCOO2: HRROI REG1,[ASCIZ / ?? Local file creation failure ??
/]
PSOUT
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
MOVE REG1,LJFN
CLOSF
JRST LOCC1
RETURN
LOCC1: HRROI REG1,[ASCIZ / ?? Local file CLOSE failure ??
/]
PSOUT
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: UTIL -- SIZE IN WORDS
;
LOCS: BEGINR
MOVE REG1,LJFN
MOVE REG2,[2,,11] ; READ 2 WORDS, OFFSET OF 11
HRRZI REG3,UBUF1
GTFDB
JRST .+3
SETZ UTIL,
RETURN
LDB REG1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
MOVEI REG2,↑D36
IDIVI REG2,(REG1) ; BYTES/WD
MOVE REG3,UBUF1+1 ; BYTE COUNT TO EOF
ADDI REG3,-1(REG2) ; ACCOUNT FOR TRUNCATION
IDIVI REG3,(REG2) ; NUMBER OF WORDS
MOVE UTIL,REG3
ENDR
; LOCDG -- LOCAL FILE WRITE DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG: BEGINR <IOREG,UTIL>
HRROI REG1,GBUF1
SETZ REG2,
IDTIM
RETURN
MOVE IOREG,REG2
MOVEI REG1,400000 ; FOR THIS FORK
RPCAP
TRNN REG2,600000 ; (1B18+1B19) WHEEL OR OPER
RETURN
MOVE UTIL,REG3
TRO REG3,(REG2)
EPCAP ; ENABLE (!)
HRR REG1,LJFN
HRLI REG1,14 ; OFFSET 14 (LAST WRITE)
SETO REG2,
MOVE REG3,IOREG
CHFDB
JRST .+1
MOVEI REG1,400000
MOVE REG3,UTIL
EPCAP ; RESET CAPABILITIES
ENDR
; LOCDP -- LOCAL FILE WRITE DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP: BEGINR
MOVE REG1,LJFN
MOVE REG2,[1,,14] ; 1 WORD, OFFSET 14 (LAST WRITE)
HRRZI REG3,GBUF1
GTFDB
JRST .+3
SETZM GBUF1
RETURN
HRROI REG1,GBUF1
MOVE REG2,GBUF1
SETZ REG3,
ODTIM
ENDR
; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN: BEGINR <IOREG,UTIL>
SETZM MOVSUM
CALLR LOCS
MOVEM UTIL,MOVSPA
MOVN IOREG,UTIL
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVEM REG3,MOVTIM
MOVLN1: MOVE REG1,LJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
CAMGE REG3,IOREG
MOVE REG3,IOREG
SIN
MOVE REG1,DCDJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
CAMGE REG3,IOREG
MOVE REG3,IOREG
SOUT
MOVN UTIL,IOREG
CAILE UTIL,SIZPAG
MOVEI UTIL,SIZPAG
SETZ REG1,
ADD REG1,<PAGE-1>(UTIL)
SOJG UTIL,.-1
ADDM REG1,MOVSUM
ADDI IOREG,SIZPAG
JUMPL IOREG,MOVLN1
MOVE REG1,DCDJFN
MOVEI REG2,21
MTOPR
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVE REG2,MOVTIM
SUB REG3,REG2
MOVEM REG3,MOVTIM
ENDR
; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL: BEGINR <UTIL>
SETOM FLAGEF
SETZM MOVSUM
SETZM MOVSPA
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVEM REG3,MOVTIM
MOVNL1: MOVE REG1,DCDJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
SIN
MOVE REG1,LJFN
MOVE REG2,[444400,,PAGE]
ADDI REG3,SIZPAG ; WORDS RECEIVED
JUMPE REG3,MOVNL2
MOVEI UTIL,(REG3)
MOVNI REG3,(REG3)
SOUT
ADDM UTIL,MOVSPA
SETZ REG1,
ADD REG1,<PAGE-1>(UTIL)
SOJG UTIL,.-1
ADDM REG1,MOVSUM
MOVNL2: SKIPE FLAGEF
JRST MOVNL1
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVE REG2,MOVTIM
SUB REG3,REG2
MOVEM REG3,MOVTIM
ENDR
; VERIFY (WORD-BY-WORD COMPARE)
;
MOVV: BEGINR <IOREG,UTIL,FLAG>
SETZ UTIL,
SETZ FLAG,
SETOM FLAGEF
SETZM MOVSUM
MOVV1: CAIN FLAG,0
ADDI UTIL,1
MOVE REG1,LJFN
BIN
SKIPN FLAGEF
JRST MOVV2
MOVE IOREG,REG2
MOVE REG1,DCDJFN
BIN
SKIPN FLAGEF
JRST MOVV5
ADDM REG2,MOVSUM
CAMN IOREG,REG2
JRST MOVV1
AOJA FLAG,MOVV1
MOVV2: SETOM FLAGEF
MOVE REG1,DCDJFN
BIN
SKIPE FLAGEF
JRST MOVV4
JUMPN FLAG,MOVV3
HRROI REG1,[ASCIZ / [OK]
/]
PSOUT
RETURN
MOVV3: CAIE FLAG,1
JRST .+4
HRROI REG1,[ASCIZ / (There is one different word at /]
PSOUT
JRST MOVV03
HRROI REG1,[ASCIZ / (There are /]
PSOUT
TNOUT <FLAG>
HRROI REG1,[ASCIZ / different words, with the first difference at /]
PSOUT
MOVV03: TNOUT <UTIL>
HRROI REG1,[ASCIZ /.)
/]
PSOUT
RETURN
MOVV4: ADDM REG2,MOVSUM
BIN
SKIPE FLAGEF
JRST MOVV4
HRROI REG1,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
PSOUT
RETURN
MOVV5: HRROI REG1,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
PSOUT
ENDR
; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI: SETOM FLAGCO
DEBRK
EOFPSI: SKIPN FLAGEF
JRST EOFPSE
SETZM FLAGEF
DEBRK ; RETURN FROM INTERRUPT
EOFPSE: HRROI REG1,[ASCIZ / ?? Unexpected EOF at /]
PSOUT
MOVEI REG1,101
HRRZ REG2,PSIPC1
SUBI REG2,1
MOVEI REG3,10
SETZ REG4,
NOUT
JRST .+1
HRROI REG1,[ASCIZ / ??
/]
PSOUT
HALTF
JRST .-1
ILIPSI: HRRZ REG1,PSIPC1
MOVE REG2,-1(REG1)
CAMN REG2,[GTFDB]
JRST ILIPSD
CAMN REG2,[CHFDB]
JRST ILIPSD
HRROI REG1,[ASCIZ / ?? Illegal instruction at /]
CAMN REG2,[-1]
HRROI REG1,[ASCIZ / ?? Impossible event at /]
PSOUT
MOVEI REG1,101
HRRZ REG2,PSIPC1
SUBI REG2,1
MOVEI REG3,10
SETZ REG4,
NOUT
JRST .+1
HRROI REG1,[ASCIZ / ??
/]
PSOUT
HALTF
JRST .-1
ILIPSD: HRROI REG1,[ASCIZ / (Bad local device.)
/]
PSOUT
AOS PSIPC1
DEBRK ; RETURN FROM INTERRUPT
-4436:>
-4439,4465
; ***DATA***
CRLF: BYTE (7)15,12,0,0,0
SEMI: BYTE (7)73,15,12,0,0
HOSTS: 11,,[ASCIZ /HARVARD/]
13,,[ASCIZ /ITS/] ; SAIL
37,,[ASCIZ /CCA/]
53,,[ASCIZ /OFFICE"-1/]
55,,[ASCIZ /SCI/]
56,,[ASCIZ /RUTGERS/]
61,,[ASCIZ /BBN/] ; TENEXB
70,,[ASCIZ /SUMEX/]
102,,[ASCIZ /AIC/]
106,,[ASCIZ /ITS/] ; DMS
126,,[ASCIZ /ISI/] ; ISI
162,,[ASCIZ /BBN/] ; TENEXD
206,,[ASCIZ /ITS/] ; AI
226,,[ASCIZ /ISI/] ; ISIC
305,,[ASCIZ /BBN/] ; TENEXA
306,,[ASCIZ /ITS/] ; ML
326,,[ASCIZ /ISI/] ; ISID
354,,[ASCIZ /ITS/] ; MC
361,,[ASCIZ /BBN/] ; TENEXC
364,,[ASCIZ /ISI/] ; ISIB
0
LIT ; LITERALS GO HERE
; (((ITS)))
IFL F.TENX,<
IOBUFR: BLOCK 2000
LCLDEV: BLOCK 1 ; local device
LCLFN1: BLOCK 1
LCLFN2: BLOCK 1
LCLSNM: BLOCK 1 ; SNAME
RCHBLK: BLOCK 10 ; network status goes here
LCLRCV: BLOCK 1
LCLTRN: BLOCK 1
FORRCV: BLOCK 1
FORTRN: BLOCK 1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
RELOC 0
IFE F.SAIL,<
ICPBLK: SIXBIT /IMP/
0
100 ; LOCAL SOCKET
40,,DCHOST ; 32 BIT BYTES (ICP), CCA HOST
DCSOKT ; DATACOMPUTER SOCKET
DCIBLK: SIXBIT /IMP/
0
102 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP + 1
DCOBLK: SIXBIT /IMP/
0
103 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP
DCDBLK: SIXBIT /IMP/
0
0 ; LOCAL SOCKET (104 RECEIVE, 105 SEND)
44,,DCHOST ; 36 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP +2 OR +3
WRKBLK: BLOCK 5
ICCHAS: 10 ; IMAGE MODE
SIXBIT /IMP/
0,,ICPBUF
ICPBUF: BLOCK 3
DCCHAS: 0 ; 7 BIT ASCII MODE
SIXBIT /IMP/
DCOBUF,,DCIBUF
>
DCIBUF: BLOCK 3
DCOBUF: BLOCK 3
DDCHAS: 13 ; BINARY
SIXBIT /IMP/
DDOBUF,,DDIBUF
DDIBUF: BLOCK 3
DDOBUF: BLOCK 3
; (((SAIL)))
IFN F.SAIL,<
CONECB: BLOCK 7
; OTHER RANDOM THINGS
TERBLK: 3 ; TERMINATE BLOCK
0 ; STATUS BITS
1 ; FOREIGN SOCKET LOC
0 ; DON'T WAIT
STTBLK: 2
BLOCK 2
-4468
LFILE: 0 ; LOCAL FILE NAME
0 ; EXTENSION
0 ; PROTECTION AND CREATION DATE
0 ; PROJ-PROG - 0 IS SELF
LFCHAS: 13 ; BINARY MODE
SIXBIT /DSK/
LFOBUF,,LFIBUF
LFIBUF: BLOCK 3
LFOBUF: BLOCK 3
LDIR: 0 ; PROJ-PROG OF USER
0 ; "UFD"
0
0 ; [1,1]
LDCHAS: 13
SIXBIT /DSK/
0,,LDIBUF
LDIBUF: BLOCK 3
LUTDSP: 0
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
LEVTAB: PSIPC1
PSIPC2
PSIPC3
PSIPC1: BLOCK 1
PSIPC2: BLOCK 1
PSIPC3: BLOCK 1
CHNTAB: 1,,TCOPSI
REPEAT 9,<EXP 0>
1,,EOFPSI
REPEAT 4,<EXP 0>
1,,ILIPSI
REPEAT ↑D20,<EXP 0>
FLAGCO: 0
FLAGEF: 0
DCSOCK: DCSOKT
ICPSOC: 0 ; ICP SOCKET
DCIJFN: 0 ; DC INPUT JFN
DCOJFN: 0 ; DC OUTPUT JFN
DCDJFN: 0 ; DC DATA JFN
LFILE: BLOCK SBUFS
LJFN: 0
PAGE: BLOCK SIZPAG
>
; (((↑↑↑)))
-4480,4480
FLAGTT: -1
-4505,4505
-1 ; cretinous LINK-10 bug